import {type AxiosRequestConfig, type AxiosResponse, type InternalAxiosRequestConfig} from "axios";
/* 进度条 */
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import {useUserStore} from "@/stores/user";

//配置不显示右上角旋转进度条，只显示水平进度条
NProgress.configure({showSpinner: false});
/**
 * 请求拦截器
 * @param config
 */
export const requestInterceptor = (config: InternalAxiosRequestConfig<any>) => {
	let userStore = useUserStore();
	//显示水平进度条
	showProgress(config) && NProgress.start();
	config.headers.set('userTempId', userStore.uuidToken);
	userStore.userToken && config.headers.set('token', userStore.userToken)
	return config;
}
/**
 * 响应拦截器
 * @param response
 */
export const responseInterceptor = (response: AxiosResponse<any, any>) => {
	//隐藏水平进度条
	showProgress(response.config) && NProgress.done();
	if (response.data.code !== 200) {
		return handleError({code: response.data.code, message: response.data.message, config: response.config});
	}
	return response.data;
}

/**
 * 是否展示接口请求进度条,默认为true
 * @param config
 * @returns
 */
function showProgress(config: AxiosRequestConfig): boolean {
	const showProgress = config.meta?.showProgress;
	if (showProgress === undefined) {
		return true;
	}
	return showProgress;
}

/**
 * 统一进行错误处理
 * @param error
 * @returns
 */
export const handleError = (error: any): Promise<any> => {
	const config = error.config;
	showProgress(config) && NProgress.done();

	if (errorHandle(config)) {//全局处理错误
		handleErrorCode(error);
	}
	return Promise.reject(error);//不处理异常错误，调用方处理
}

/**
 * 根据错误码处理异常
 */

function handleErrorCode(error: any) {
	switch (error.code || error.status) {
		case 208:
			const userStore = useUserStore();
			userStore.logout().then(() => {
				location.reload();
			});
			break;
		default:
			if (tipMsg(error.config)) {//弹窗错误消息
				alert(error.message);
			}

	}
}

/**
 * 是否全局错误处理
 * @param config
 */
function errorHandle(config: AxiosRequestConfig) {
	const errorHandle = config.meta?.errorHandle;
	if (errorHandle === undefined) {
		return true;
	}
	return errorHandle;
}

/**
 * 是否提示错误消息
 * @param config
 */
function tipMsg(config: AxiosRequestConfig) {
	const tipMsg = config.meta?.tipMsg;
	if (tipMsg === undefined) {
		return true;
	}
	return tipMsg;
}